Java String 概览 String 被声明为 final,因此它不可被继承(Integer 等包装类也不能被继承)。 在 Java 8 中,String 内部使用 char 数组存储数据。 public final class String implements java.io.Serializable, Comparable<String>, CharSequence { /** The value is used for character storage. */ private final char value[]; } 在 Java 9 之后,String 而在 Java 7,String Pool 被移到堆中。这是因为永久代的空间有限,在大量使用字符串的场景下会导致 OutOfMemoryError 错误。 #18 = Utf8 java/lang/String #19 = Utf8 abc // ...
Java HashMap 本文为个人学习摘要笔记。 原文地址:Java8 系列之重新认识 HashMap 摘要 HashMap 是 Java 使用频率最高的用于映射(键值对)处理的数据类型。 Java 为数据结构中的映射定义了一个接口 java.util.Map,此接口主要有四个常用的实现类,分别是 HashMap、Hashtable、LinkedHashMap 和 TreeMap,类继承关系如下图所示 哈希表为解决冲突,可以采用开放地址法和链地址法等来解决问题,Java 中 HashMap 采用了链地址法。链地址法,简单来说,就是数组加链表的结合。 系统将调用 key 的 hashCode() 方法得到其 hashCode 值(该方法适用于每个 Java 对象),然后再通过 Hash 算法的后两步运算(高位运算和取模运算)来定位该键值对的存储位置, 如果哈希桶数组很大,即使较差的 Hash 算法也会比较分散,如果哈希桶数组数组很小,即使好的 Hash 算法也会出现较多碰撞,所以就需要在空间成本和时间成本之间权衡,其实就是在根据实际情况确定哈希桶数组的大小,并在此基础上设计好的
Java 异常 Throwable 可以用来表示任何可以作为异常抛出的类,分为两种:Error 和 Exception。 Error Error 类对象由 Java 虚拟机生成并抛出,大多数错误与代码编写者所执行的操作无关。 例如,Java 虚拟机运行错误(Virtual MachineError),当 JVM 不再有继续执行操作所需的内存资源时,将出现 OutOfMemoryError。 这些异常发生时,Java 虚拟机(JVM)一般会选择线程终止;还有发生在虚拟机试图执行应用时,如类定义错误(NoClassDefFoundError)、链接错误(LinkageError)。 在 Java 中,错误通常是使用 Error 的子类描述。 Exception Exception 分为两种: 受检异常:需要用 try...catch...
Java Stream Stream 总览 Stream 是 Java 8 新增加的类,用来补充集合类。 Stream 代表数据流,流中的数据元素的数量可能是有限的,也可能是无限的。 除非显示地创建并行流,否则 Java 库中创建的都是串行流。Collection.stream() 为集合创建串行流而 Collection.parallelStream() 为集合创建并行流。 这是因为 Java 不保证这些副作用对其它线程可见,也不保证相同流管道上的同样的元素的不同的操作运行在同一个线程中。很多有副作用的行为参数可以被转换成无副作用的实现。 ); // 15 System.out.println(Stream.of("A", "B", "C", "D").reduce("", String::concat)); // ABCD 基本类型 Java Stream 详解 Java 8 之基本类型优化
Java 枚举 本文为个人学习摘要笔记。 原文地址:恕我直言,我怀疑你没怎么用过枚举 为什么需要枚举 相比于使用接口或者常量类,枚举具有一个明确性的约束。 Calculator.DIVISION.execute(4.0, 2.0)); // 2.0 } } 枚举集合类 JDK5.0 中在增加 Enum 类的同时,也增加了两个工具类 EnumSet 和 EnumMap,这两个类都放在 java.util (User user : userList) { userStatisticMap.merge(user.getUserRole(), 1, Integer::sum); } 扩展阅读: Java
Java List 本文为个人学习摘要笔记。 具体详情可以参考:18 Java fail fast 这里再次分析下源码: public Iterator<E> iterator() { return new Itr(); } private
从 Java 8 开始,接口也可以拥有默认的方法实现,这是因为不支持默认方法的接口的维护成本太高了。在 Java 8 之前,如果一个接口想要添加新的方法,那么要修改所有实现了该接口的类。 并且从 Java 8 开始,接口也可以有默认的方法实现,使得修改接口的成本也变的很低。 中两个比较重要的概念。 ,重载是一个编译期概念。 关于重载是不是多态有多种论调,有些人认为重载不属于多态的体现,可以参考:Java 中多态的实现方式 多态 上面总结了重写与重载的概念与他们之间的区别,这里再说一下多态,以及为什么说重载不属于多态。
基本原理 volatile 在Java中允许线程访问共享变量,为了确保共享变量能被准确和一致的更新,线程应该确保使用排它锁来单独获得这个变量,Java中提供了 volatile,使之在多处理器开发中保证变量的可见性 synchronized 通过锁机制实现同步,在Java中每一个对象都可以作为锁,有以下三种形式: 对于普通同步方法,锁的是当前实例对象。 对于静态同步方法,所得是当前类 class 对象。 为了减少获得锁和释放锁带来的性能消耗,Java SE 1.6 引入了偏向锁和轻量级锁。
与大多数程序设计语言一样,Java中的注释也不会出现在可执行程序中。因此,可以在源程序中根据需要添加任意多的注释,而不必担心可执行代码会膨胀。 ~ 本篇主要记录内容包括:Java 注释、声明变量、变量的初始化、常量及枚举类型变量。 ---- 上一篇内容:Java基础:Java程序设计环境 下一篇内容:Java基础:Java数据类型 更多知识学习:全网最全的 Java 技术栈内容梳理(持续更新中) ---- 文章目录 一、Java 注释 二、变量与常量 1、声明变量 2、变量的初始化 3、常量 4、枚举类型变量 三、方法 1、方法的构成 2、方法参数传递 3、方法的重载 ---- 一、Java 注释 与大多数程序设计语言一样,Java 与所有程序设计语言一样,Java 也使用变量来存储值,常量就是指不变的变量。 1、声明变量 在 Java 中,每个变量都有一个类型(type)。在声明变量时,变量的类型位于变量名之前。
比如java.exe进程中可以运行很多线程。线程总是属于某个进程,进程中的多个线程共享进程的内存。 2.java中的线程 一个Java应用总是从main()方法开始运行,mian()方法运行在一个线程内,它被称为主线程。 其他线程通过使用java.lang.Thread类或者java.lang.Runnable接口编写代码来定义、实例化和启动新线程。 线程又分用户线程和守护线程。 4.创建一个线程 Java提供了两种创建线程方法: 通过实现Runable接口; 通过继承Thread类本身。 1、如果是扩展java.lang.Thread类的线程,则直接new即可。 6.线程的几个概念 在多线程编程时,你需要了解以下几个概念: 线程同步 线程间通信 线程死锁 线程控制:挂起、停止和恢复 7.线程同步和锁下次学习
在学习Java网络编程之前,先来了解一下涉及到的基础概念。 ---- 转载请注明出处——胡玉洋 《Java网络编程——基础概念》
并行(parallelism) 这个概念很好理解。所谓并行,就是同时执行的意思,无需过度解读。判断程序是否处于并行的状态,就看同一时刻是否有超过一个“工作单位”在运行就好了。 并发(concurrency) 要理解“并发”这个概念,必须得清楚,并发指的是程序的“结构”。当我们说这个程序是并发的,实际上,这句话应当表述成“这个程序采用了支持并发的设计”。
Java 程序获取时间戳最常用的方法 标准库 Java 标准库有两套处理日期和时间的 API: 一套定义在 java.util 这个包里面,主要包括 Date、Calendar 和 TimeZone 这几个类 // 星期四 十二月 26, 2019 Date 对象有几个严重的问题:它不能转换时区,除了 toGMTString() 可以按 GMT+0:00 输出外,Date 总是以当前计算机系统的默认时区为基础进行输出 在数据库中存储日期和时间 除了旧式的 java.util.Date,我们还可以找到另一个 java.sql.Date,它继承自 java.util.Date,但会自动忽略所有时间相关信息。 在使用 Java 程序操作数据库时,我们需要把数据库类型与 Java 类型映射起来。 下表是数据库类型与 Java 新旧 API 的映射关系: 数据库 对应 Java 类(旧) 对应 Java 类(新) DATETIME java.util.Date LocalDateTime DATE
Java final 与 static final 数据 声明数据为常量,可以是编译时常量,也可以是在运行时被初始化后不能被改变的常量。
Java 只有值传递 本文为个人学习摘要笔记。 Java 中的值传递 上面的三个栗子,表现的结果不一样,导致大家对 Java 中传递类型产生困惑。 其实,上面的概念没有错,只是代码的例子有问题。 这里再复习下值传递和引用传递的概念,然后再举几个真正恰当的例子。 通过概念我们也能知道,这里是把实际参数的引用的地址复制了一份,传递给了形式参数。所以,上面的参数其实是值传递,把实参对象引用的地址当做值传递给了形式参数。 简单点说,Java 中的传递,是值传递,而这个值,实际上是对象的引用。而按共享传递其实只是按值传递的一个特例罢了。所以我们可以说 Java 的传递是按共享传递,或者说 Java 中的传递是值传递。
Java 虚拟机 本文为个人学习摘要笔记。 Java 虚拟机栈 每个 Java 方法在执行的同时会创建一个栈帧用于存储局部变量表、操作数栈、常量池引用等信息。 通过引入 Region 的概念,从而将原来的一整块内存空间划分成多个的小空间,使得每个小空间可以单独进行垃圾回收。这种划分方法带来了很大的灵活性,使得可预测的停顿时间模型成为可能。 其中二进制字节流可以从以下方式中获取: 从 ZIP 包读取,成为 JAR、EAR、WAR 格式的基础。 从网络中获取,最典型的应用是 Applet。 好处 使得 Java 类随着它的类加载器一起具有一种带有优先级的层次关系,从而使得基础类得到统一。
Java Object 通用方法 概览 public boolean equals(Object obj) public native int hashCode() protected native CloneExample e1 = new CloneExample(); // CloneExample e2 = e1.clone(); // 'clone()' has protected access in 'java.lang.Object CloneExample e2 = e1.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } java.lang.CloneNotSupportedException Effective Java 书上讲到,最好不要去使用 clone(),可以使用拷贝构造函数或者拷贝工厂来拷贝一个对象。
Java小工匠聊网络编程--JavaNIO-基础概念 1、同步与异步 同步与异步主要是从消息通知机制角度来说的。同步没有通知,异步有知。
接上文java消息队列基础和RabbitMQ相关概念 紧跟基础和相关概念后更新的高级特性,后续会更新面试专题~~ RabbitMQ高级特性 1. --4.1 设置队列的过期时间 ttl--> <entry key="x-message-ttl" value="10000" value-type="<em>java</em>.lang.Integer --4.2 设置队列的长度限制 max-length --> <entry key="x-max-length" value="10" value-type="<em>java</em>.lang.Integer x-dead-letter-routing-key" value="dlx.order.cancel" /> <entry key="x-message-ttl" value="10000" value-type="<em>java</em>.lang.Integer
你好,这里是codetrend专栏“高并发编程基础”。引言在Java并发编程中,Monitor(监视器)是一种同步机制,用于实现线程间的互斥访问和共享资源的同步。 它是一种基本的并发控制原语,在Java中以对象的形式存在。每个Java对象都有一个与之关联的Monitor,可以通过synchronized关键字来使用该Monitor。 Monitor提供了以下核心概念:锁定(Locking):一个Monitor只能被一个线程锁定,其他线程需要等待锁的释放才能继续执行。 Java对象头Java对象头(Object Header)是Java虚拟机中用于管理对象的一部分元数据,存储在每个Java对象的内存中。它包含了一些重要的信息,用于支持对象的运行时特性和垃圾回收。 Java对象头在内存中紧跟在对象的地址之后,它是实现Java虚拟机的关键组成部分。